#include <pthread.h>
#include <bits/stdc++.h>
#include <unistd.h>
#include "mutex.hpp"
using namespace std;
// void* ThreadRun(void* args)
// {
// //    pthread_detach(pthread_self());
//    cout << "I am a thread" << endl;
// }
// int main()
// {
//    pthread_t tid;
//    pthread_create(&tid,nullptr,ThreadRun,nullptr);

//    sleep(1);
//    pthread_detach(tid);
//    //被分离后就会无法回收,返回错误码
//    int n = pthread_join(tid,nullptr);

//    cout << n << strerror(n) << endl;

//     return 0;
// }
// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// 定义成全局就不需要初始化了
int ticket = 1000; // 用多线程模拟一轮抢票
struct Data
{
public:
    string name;
    pthread_mutex_t *mutex;
};
// void *route(void *arg)
// {
//     Data *node = static_cast<Data *>(arg);
//     while (true)
//     {
//         //线程对于锁的竞争能力可能会不同
//         pthread_mutex_lock(node->mutex);
//         // 申请锁成功,才能往后执行,不成功,阻塞等待
//         if (ticket > 0)
//         {
//             usleep(1000);
//             printf("%s sells ticket:%d\n", node->name.c_str(), ticket);
//             ticket--;
//             pthread_mutex_unlock(node->mutex);
//         }
//         else
//         {
//            pthread_mutex_unlock(node->mutex);
//             break;
//         }
//         usleep(13);
//     }
//     return nullptr;
// }
pthread_mutex_t lk = PTHREAD_MUTEX_INITIALIZER;
void *route(void *arg)
{
    Data *node = static_cast<Data *>(arg);
    while (true)
    {
        {
            LockGuard lockguard(&lk);
            if (ticket > 0)
            {
                usleep(1000);
                printf("%s sells ticket:%d\n", node->name.c_str(), ticket);
                ticket--;
            }
            else
            {
                break;
            }
        }
        usleep(13);
    }
    return nullptr;
}
int main(void)
{
    pthread_mutex_t mutex;
    pthread_mutex_init(&mutex, nullptr);

    Data *arr = new Data[4]{{"thread 1", &mutex}, {"thread 2", &mutex}, {"thread 3", &mutex}, {"thread 4", &mutex}};
    pthread_t t1, t2, t3, t4;
    pthread_create(&t1, nullptr, route, (void *)&arr[0]);
    pthread_create(&t2, nullptr, route, (void *)&arr[1]);
    pthread_create(&t3, nullptr, route, (void *)&arr[2]);
    pthread_create(&t4, nullptr, route, (void *)&arr[3]);
    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);
    pthread_join(t3, nullptr);
    pthread_join(t4, nullptr);

    pthread_mutex_destroy(&mutex);
    delete[] arr;


    // int x,y;cin >> x >> y;
    // cout << ({
    //     int tmp;
    //     if(x > y) tmp = y;
    //     else tmp = x;
    //     tmp;
    // }) << endl;
}